package com.pai4j.remote.jianlipai;

import com.pai4j.common.bean.PAIPageResponseBeanUtil;
import com.pai4j.common.bean.PAIResponseBean;
import com.pai4j.common.config.annotation.SafeClick;
import com.pai4j.common.config.annotation.ValidateLogin;
import com.pai4j.common.enums.ClickEvent;
import com.pai4j.domain.dto.jianlipai.ResumeDetail;
import com.pai4j.domain.vo.request.jianlipai.AICreateResumeVO;
import com.pai4j.domain.vo.request.jianlipai.CreateResumeVO;
import com.pai4j.domain.vo.request.jianlipai.OnePaperSaveRequestVO;
import com.pai4j.domain.vo.response.jianlipai.OnePaperFileVO;
import com.pai4j.domain.vo.response.jianlipai.ResumeBaseVO;
import com.pai4j.domain.vo.response.jianlipai.ResumeManageVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.List;


/**
 * 简历管理相关接口
 *
 * @author: CYM-pai
 * @date: 2025/07/15 08:34
 **/
@FeignClient(name = "pai4j-JianLiPai-service", contextId = "JianLiPaiClient")
public interface JianLiPaiClient {
    
    /**
     * 获取简历列表
     *
     * @param pageNo   页码
     * @param pageSize 页大小
     * @return 简历列表
     */
    
    @GetMapping("/JianLipai-service/admin/resume/list")
    PAIPageResponseBeanUtil<List<ResumeManageVO>> getResumeList(@RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo,
     
                                                                @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize);
    
    /**
     * 创建简历
     *
     * @param createResumeVO 简历信息
     * @return 简历ID
     */
    @ValidateLogin
    @SafeClick(event = ClickEvent.CREATE_RESUME, time = 30000, message = "30s内只能创建一次")
    @PostMapping("/JianLipai-service/user/create")
    PAIResponseBean<String> createResume(@RequestBody @Valid CreateResumeVO createResumeVO);
    
    /**
     * AI简历生成
     *
     * @param aiCreateResumeVO 简历信息
     * @return 简历ID
     */
    @ValidateLogin
    @SafeClick(event = ClickEvent.AI_CREATE_RESUME, time = 30000, message = "30s内只能生成一次")
    @PostMapping("/JianLipai-service/user/aiGen")
    PAIResponseBean<ResumeDetail> aiGen(@RequestBody @Valid AICreateResumeVO aiCreateResumeVO);
    
    /**
     * 删除简历
     *
     * @param resumeId 简历ID
     * @return 删除结果
     */
    @ValidateLogin
    @PostMapping("/JianLipai-service/user/delete/{resumeId}")
    PAIResponseBean<Boolean> deleteResume(@PathVariable String resumeId);
    
    /**
     * 获取用户简历列表
     *
     * @author: CYM-pai
     * @date: 2025/05/07 10:50
     **/
    @GetMapping("/JianLipai-service/user/listUserResumes")
    PAIResponseBean<ResumeBaseVO> listUserResumes();
    
    /**
     * 保存简历: 对应前端的导出pdf
     *
     * @param saveRequest
     * @return
     */
    @ValidateLogin
    @PostMapping("/JianLipai-service/user/save")
    PAIResponseBean<String> save(@RequestBody OnePaperSaveRequestVO saveRequest);
    
    /**
     * 获取简历文件
     *
     * @param id      简历ID
     * @return 简历详情
     */
    @ValidateLogin
    @GetMapping("/JianLipai-service/user/file/{id}")
    PAIResponseBean<OnePaperFileVO> filename(@PathVariable String id);
    
    /**
     * 获取简历详情
     *
     * @param id 简历ID
     * @return 简历详情
     */
    @GetMapping("/JianLipai-service/user/detail/{id}")
    PAIResponseBean<OnePaperSaveRequestVO> detail(@PathVariable String id,
                                                  @RequestParam(value = "view",
                                                  required = false,
                                                  defaultValue = "false") Boolean view);
    /**
     *  ai生成简历摘要
     *
     * @author: CYM-pai
     * @date: 2025/05/07 11:02
     **/
     
    @PostMapping("/JianLipai-service/user/ai/summary/{id}")
    PAIResponseBean summary(@PathVariable String id);
    
    /**
     * 处理发送消息请求的方法 该方法首先检查传入的消息是否为空，然后获取当前用户的ID，
     * 并根据用户ID获取对应的SseEmitter对象 接着，它会获取用户聊天的上下文消息，
     * 如果上下文为空，则添加系统默认的上下文消息 最后，将用户发送的消息添加到上下文中，
     * 并尝试通过SseEmitter对象发送消息
     *
     * @author: CYM-pai
     * @date: 2025/05/07 11:03
     **/
    @ValidateLogin
    @PostMapping("/JianLipai-service/user/ai/chat/completion/send")
    PAIResponseBean sendMessage(@RequestBody String message);
    
    /**
     * 添加系统消息接口
     * 该方法用于接收客户端发送的消息，并将其作为系统消息添加到对话上下文中
     * 主要用于在对话过程中，将一些特定的信息作为系统消息插入
     *
     * @author: CYM-pai
     * @date: 2025/05/07 11:14
     **/
    @ValidateLogin
    @PostMapping("/JianLipai-service/user/addSystemMessage")
    PAIResponseBean addSystemMessage(@RequestBody String message);
    
    /**
     * 停止聊天流接口
     * 当用户结束与AI的聊天时调用此方法，以关闭对应的SseEmitter流
     * 防止资源泄露和不必要的消息推送
     *
     * @author: CYM-pai
     * @date: 2025/05/07 11:15
     **/
    @ValidateLogin
    @GetMapping("/JianLipai-service/user/ai/chat/completion/stream/stop")
    PAIResponseBean stopChat();
    
    /**
     * 创建聊天流接口 建立与客户端的长连接，用于实时推送AI的回复消息 只有当用户登录时，才能创建有效的聊天流
     *
     * @author: CYM-pai
     * @date: 2025/05/07 11:16
     **/
    @ValidateLogin
    @GetMapping(path = "/JianLipai-service/user/ai/chat/completion/stream", produces = "text/event-stream")
    SseEmitter channel(HttpServletRequest request);
}
